//   Copyright 2012,2013 Vaughn Vernon
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.

package com.saasovation.common.domain.model.process;

import java.util.Date;

/**
 * 流程
 */
public interface Process {
    /**
     * 流程完成类型
     * NotCompleted:没完成
     * CompletedNormally:正常完成
     * TimedOut:超时
     */
    public enum ProcessCompletionType {
        NotCompleted,
        CompletedNormally,
        TimedOut
    }

    /**
     * 允许的持续时间
     * @return 返回长整型
     */
    public long allowableDuration();

    /**
     * 能否超时
     * @return 返回布尔
     */
    public boolean canTimeout();

    /**
     * 获取当前持续时间
     * @return 返回长整型
     */
    public long currentDuration();

    /**
     * 获取内容描述
     * @return 返回字符串
     */
    public String description();

    /**
     * 流程是否完成
     * @return 返回布尔
     */
    public boolean didProcessingComplete();

    /**
     * 通知超时
     * @param aTimedOutDate 超时日期
     */
    public void informTimeout(Date aTimedOutDate);

    /**
     * 是否已完成
     * @return 返回布尔
     */
    public boolean isCompleted();

    /**
     * 是否超时
     * @return  返回布尔
     */
    public boolean isTimedOut();

    /**
     * 是否没完成
     * @return  返回布尔
     */
    public boolean notCompleted();

    /**
     * 获取流程完成类型
     * @return  返回流程完成类型
     */
    public ProcessCompletionType processCompletionType();

    /**
     * 获取流程iD
     * @return  返回流程ID
     */
    public ProcessId processId();

    /**
     * 获取开始日期
     * @return  返回日期
     */
    public Date startTime();

    /**
     * 获取时间受限的流程跟踪器
     * @return 返回时间受限的流程跟踪器
     */
    public TimeConstrainedProcessTracker timeConstrainedProcessTracker();

    /**
     * 获取超时日期
     * @return  返回日期
     */
    public Date timedOutDate();

    /**
     * 获取总允许持续时间
     * @return  返回长整型
     */
    public long totalAllowableDuration();

    /**
     * 获取允许的总重试次数
     * @return 返回整型
     */
    public int totalRetriesPermitted();
}
